package marketplace.web.beans;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import marketplace.ejb.interfaces.IContenidoDigitalEJB;
import marketplace.jpa.datas.DataCategoria;
import marketplace.jpa.datas.DataSubcategoria;

import org.primefaces.event.RowEditEvent;

@ManagedBean
@Stateful
public class SubcategoriaBean {

	/////////////////////////// ATRIBUTOS //////////////////////////////
	
	@EJB
	IContenidoDigitalEJB cdEjb;	
	
	private DataSubcategoria subcategoria;
	private DataCategoria categoria;
	
	private List<DataSubcategoria> subcategorias;
	private List<DataCategoria> categorias;
	private List<DataCategoria> categoriasConSubcategorias;
	
	
	/////////////////////////// GETERS & SETERS ////////////////////////
	
	public DataSubcategoria getSubcategoria() {
		return subcategoria;
	}
	public void setSubcategoria(DataSubcategoria subcategoria) {
		this.subcategoria = subcategoria;
	}
	public DataCategoria getCategoria() {
		return categoria;
	}
	public void setCategoria(DataCategoria categoria) {
		this.categoria = categoria;
	}
	public List<DataCategoria> getCategorias() {
		return categorias;
	}
	public void setCategorias(List<DataCategoria> categorias) {
		this.categorias = categorias;
	}
	public List<DataSubcategoria> getSubcategorias() {
		return subcategorias;
	}
	public void setSubcategorias(List<DataSubcategoria> subcategorias) {
		this.subcategorias = subcategorias;
	}
	public List<DataCategoria> getCategoriasConSubcategorias() {
		return categoriasConSubcategorias;
	}
	public void setCategoriasConSubcategorias(
			List<DataCategoria> categoriasConSubcategorias) {
		this.categoriasConSubcategorias = categoriasConSubcategorias;
	}
	
	/////////////////////////// OPERACIONES ////////////////////////////
	
	
	@PostConstruct
	public void init(){
		setCategoria(new DataCategoria());
		setSubcategoria(new DataSubcategoria());
		try {
			setCategorias(cdEjb.getCategorias());
			setSubcategorias(cdEjb.getSubCategorias());
			setCategoriasConSubcategorias(cdEjb.getCategoriasConSubcategorias());
		} catch (Exception e) {
			System.out.println("ERROR init() SubcategoriaBean: " + e.getMessage());
		}
	}
	
	
	//// CATEGORIA //////////////////////////////////////////////////////
	
	//GET REGISTRAR
	public void getRegistroCategoria() throws Exception{
		FacesContext.getCurrentInstance().getExternalContext().redirect("categoriaRegistro.xhtml");
	}	
	
	//POST REGISTRAR
	public void postRegistroCategoria(ActionEvent actionEvent){	
		try {
			if(getCategoria().getNombre().isEmpty())
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe ingresar el nombre de la categoria deseada",""));
			else if (!cdEjb.existeCategoria(getCategoria().getNombre())) {
				cdEjb.guardarCategoria(getCategoria().getNombre(), getCategoria().getDescripcion());			
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha registrado la categorra: ", getCategoria().getNombre() + "!, correctamente"));
				FacesContext.getCurrentInstance().getExternalContext().redirect("categorias.xhtml");
			}else{
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: La categoria, ya existe",""));
			}
		} catch (Exception e) {
			System.out.println("ERROR postRegistroCategoria: " + e.getMessage());
		}
	}
	
	//GET LISTAR
	public void getListarCategorias() throws Exception{
		FacesContext.getCurrentInstance().getExternalContext().redirect("categorias.xhtml");
	}	
	
	//MODIFICAR
    public void onEditCategoria(RowEditEvent event) {
	    DataCategoria catWeb = ((DataCategoria) event.getObject());
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha modificado la categoria: ", catWeb.getNombre() + " !,  correctamente"));
		try {
			cdEjb.modificarCategoria(catWeb);			
		} catch (Exception e) {
			e.printStackTrace();
		}
    }  
      
    public void onCancelCategoria(RowEditEvent event) {  
        FacesMessage msg = new FacesMessage("Operacion cancelada para: ", ((DataCategoria) event.getObject()).getNombre());    
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }
    
    //ELIMINAR
	public void postEliminarCategoria(String nombre){
		try {
			cdEjb.eliminarCategoria(nombre);
			init();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha eliminado", nombre + "!, correctamente"));			
		} catch (Exception e) {
			System.out.println("ERROR postEliminarCategoria: " + e.getMessage());
		}
	}

	
	//// SUBCATEGORIA //////////////////////////////////////////////////////
	
	//GET REGISTRAR
	public void getRegistroSubcategoria() throws Exception{
		FacesContext.getCurrentInstance().getExternalContext().redirect("subcategoriaRegistro.xhtml");
	}	
	
	//POST REGISTRAR
	public void postRegistroSubcategoria(ActionEvent actionEvent){	
		try {
			if(getCategoria().getNombre().isEmpty())
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe seleccionar el nombre de la categoria a la que pertenecera",""));
			else if(getSubcategoria().getNombre().isEmpty())
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe ingresar el nombre de la subcategoria deseada",""));
			else if (!cdEjb.existeSubCategoriaNombre(getSubcategoria().getNombre())) {
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: Debe existir una unica subcategoria este nombre",""));
			}else if (!cdEjb.existeSubCategoria(getSubcategoria().getNombre(), getCategoria().getNombre())) {
				cdEjb.guardarSubCategoria(getSubcategoria().getNombre(), getSubcategoria().getDescripcion(), getCategoria().getNombre());
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha registrado la subcategoria: ", getSubcategoria().getNombre() + "!, correctamente"));
				FacesContext.getCurrentInstance().getExternalContext().redirect("subcategorias.xhtml");
			}else{
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: La subcategoria en la categoria seleccionada ya existe",""));
			}
		} catch (Exception e) {
			System.out.println("ERROR postRegistroCategoria: " + e.getMessage());
		}
	}
	
	//GET LISTAR
	public void getListarSubcategorias() throws Exception{
		setCategorias(cdEjb.getCategorias());
		setSubcategorias(cdEjb.getSubCategorias());		
		FacesContext.getCurrentInstance().getExternalContext().redirect("subcategorias.xhtml");
	}
	
	//MODIFICAR
    public void onEditSubcategoria(RowEditEvent event) {
	    DataSubcategoria catWeb = ((DataSubcategoria) event.getObject());
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha modificado la subcategoria: ", catWeb.getNombre() + " !,  correctamente"));
		try {
			cdEjb.modificarSubCategoria(catWeb);			
		} catch (Exception e) {
			e.printStackTrace();
		}
    }  
      
    public void onCancelSubcategoria(RowEditEvent event) {  
        FacesMessage msg = new FacesMessage("Operacion cancelada para: ", ((DataSubcategoria) event.getObject()).getNombre());    
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
    
    //ELIMINAR
	public void postEliminarSubcategoria(String nombre){
		try {
			cdEjb.eliminarSubCategoria(nombre);			
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha eliminado", nombre + "!, correctamente"));
			init();
		} catch (Exception e) {
			System.out.println("ERROR postEliminarSubcategoria: " + e.getMessage());
		}
	}
	
	//Sobreescribo la lista de subcategorias para el filtro del combo
	public void getSubcategoriasPorCategoria(){
		try {
			if (getCategoria().getNombre()!=null && !getCategoria().getNombre().equals("")){ 
				setSubcategorias(cdEjb.getSubCategoriasPorCategoria(getCategoria().getNombre()));
			}else{
				setSubcategorias(cdEjb.getSubCategorias());
			}
		} catch (Exception e) {
			System.out.println("ERROR getSubcategoriaPorCategoria: " + e.getMessage());
		}
	}

	public List<DataSubcategoria> obtenerSubcategorias(String categoria){
		List<DataSubcategoria> dev = new ArrayList<DataSubcategoria>();
		try {
			if (categoria!=null && !categoria.equals("")){ 
				dev = cdEjb.getSubCategoriasPorCategoria(categoria);
			}else{
				dev = cdEjb.getSubCategorias();
			}
		} catch (Exception e) {
			System.out.println("ERROR getSubcategoriaPorCategoria: " + e.getMessage());
		}
		return dev;
	}
	
}
